home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / EditTextItem.C < prev    next >
C/C++ Source or Header  |  1990-12-20  |  4KB  |  162 lines

  1. //$EditTextItem,RestrTextItem$
  2.  
  3. #include "EditTextItem.h"
  4. #include "CheapText.h"
  5. #include "RestrTView.h"
  6. #include "BlankWin.h"
  7. #include "Dialog.h"
  8.  
  9. //---- EditTextItem ------------------------------------------------------------
  10.  
  11. MetaImpl(EditTextItem, (T(oldTextSize), TB(freeView), 0));
  12.  
  13. EditTextItem::EditTextItem(int id, char* it, int w, int l, Point b)
  14.                             : Clipper(0, gPoint0, id)
  15. {
  16.     if (it == 0)
  17.     it= "";
  18.     Init(new TextView(this, gFitRect, 
  19.                 new CheapText((byte*)it),
  20.                eLeft, eOne, TRUE, eTextViewDefault, b),
  21.           w, l, it);
  22.     freeView= TRUE;
  23.     SetFlag(eVObjVFixed);
  24. }
  25.  
  26. EditTextItem::EditTextItem(int id, TextView *t, int w, int l)
  27.                             : Clipper(0, gPoint0, id)
  28. {
  29.     Init(t, w, l, 0);
  30.     freeView= FALSE;
  31.     SetFlag(eVObjVFixed);
  32.     t->SetNextHandler(this);
  33. }
  34.  
  35. EditTextItem::~EditTextItem()
  36. {
  37.     if (vop && freeView) {
  38.     Text *t= Tv()->GetText();
  39.     SafeDelete(t);
  40.     SafeDelete(vop);
  41.     }
  42. }
  43.  
  44. void EditTextItem::Init(TextView *tv, int w, int l, char *it)
  45. {
  46.     Point me;
  47.  
  48.     vop= tv;
  49.     vop->SetFlag(eVObjLayoutCntl | eTextNoFind | eViewNoPrint);
  50.     Tv()->SetStopChars(l > 1 ? "\r" : "\r\n");
  51.     me.x= w ? w : ((it) ? tv->GetMinSize().extent.x : 100);
  52.     me.y= l*TextViewLineHeight(Tv()->GetText()->GetFont(), Tv()->GetSpacing());
  53.     SetMinExtent(me+2*gBorder);
  54.     SetNoSelection();    
  55.     oldTextSize= GetTextSize(); 
  56. }
  57.  
  58. int EditTextItem::Base()
  59. {
  60.     return vop->Base();
  61. }
  62.  
  63. Metric EditTextItem::GetMinSize()
  64. {
  65.     return Metric(Clipper::GetMinSize().extent, Base());
  66. }
  67.  
  68. bool EditTextItem::Validate()
  69. {
  70.     return TRUE;
  71. }
  72.  
  73. void EditTextItem::SetContainer(VObject *vop)
  74. {
  75.     Clipper::SetContainer(vop);
  76.     DialogView *vp= (DialogView*) FindContainerOfClass(Meta(DialogView));
  77.     Tv()->SetContainer(vop);
  78.     if (vp)
  79.     vp->AddItemWithKbdFocus(this);
  80. }
  81.  
  82. void EditTextItem::Enable(bool b, bool redraw)
  83. {
  84.     Clipper::Enable(b, redraw);
  85.     Tv()->Enable(b, redraw);
  86. }
  87.  
  88. Text *EditTextItem::SetText(Text *t)
  89. {
  90.     oldTextSize= GetTextSize();
  91.     return Tv()->SetText(t);
  92. }
  93.  
  94. void EditTextItem::SetString(byte *str, int len)
  95. {
  96.     Tv()->SetString(str, len);
  97.     oldTextSize= GetTextSize();
  98.     Tv()->RevealAlign(Rectangle(1,1));
  99.     Changed();
  100. }
  101.  
  102. void EditTextItem::Control(int id, int part, void *op)
  103. {
  104.     if (op == vop) {
  105.     if (part == cPartChangedText) {
  106.         // notify only on >0 to 0 transition and vice versa
  107.         int lastTextSize= oldTextSize;
  108.         oldTextSize= GetTextSize();
  109.         if ((lastTextSize == 0) == (oldTextSize == 0))
  110.         return;
  111.     }
  112.     id= GetId();
  113.     op= this;
  114.     }
  115.     Clipper::Control(id, part, op);
  116. }
  117.  
  118. void EditTextItem::SendDown(int id, int part, void *val)
  119. {
  120.     switch (part) {
  121.     case cPartValidate:
  122.     if (val) 
  123.         *(bool*)val= (bool) ! Validate();
  124.     break;
  125.     case cPartFocusChanged:   
  126.     FocusChanged(id, (bool) val);
  127.     break;
  128.     case cPartHasSelection:  
  129.     *(bool*)val= Tv()->HasSelection();
  130.     break;
  131.     default:
  132.     Tv()->SendDown(id, part, val);
  133.     Clipper::SendDown(id, part, val);
  134.     }
  135. }
  136.  
  137. void EditTextItem::FocusChanged(int id, bool dontRedraw)
  138. {
  139.     if (id == cIdStartKbdFocus)
  140.     SetSelection(0, cMaxInt, !dontRedraw);
  141.     else {
  142.     SetNoSelection(!dontRedraw);
  143.     if (!Validate()) {
  144.         UpdateEvent();
  145.         Token t= gToken;
  146.         t.Flags|= eFlgButDown;
  147.         GetWindow()->PushBackEvent(t);
  148.     }
  149.     }
  150. }
  151.  
  152. //---- RestrTextItem -----------------------------------------------------------
  153.  
  154. MetaImpl0(RestrTextItem);
  155.  
  156. RestrTextItem::RestrTextItem(int id, RegularExp *rex, char* initText, int width, int lines)
  157.     : EditTextItem(id,
  158.     new RestrTextView((View*)0, rex, gFitRect,
  159.         new CheapText((byte*)(initText ? initText : ""))), width, lines)
  160. {
  161. }
  162.